<?php

namespace App\Utils;

/**
 * PHP原生Session操作工具类
 */
class SSUtil
{

    /**
     * 开启Session功能
     */
    public static function start()
    {
        session_start();
    }

    /**
     * 关闭Session写入锁
     */
    public static function close()
    {
        session_write_close();
    }

    /**
     * 判断SESSION当中是否包含某个键
     * @param string|array $key 一个键或者一个键数组
     * @param bool $all 表示是否包判定含所有键
     * @return bool
     */
    public static function has($key, $all = true)
    {
        $result = true; //默认存在此键

        //单个键名SESSION检查
        if (!is_array($key)) {
            self::start();
            $result = array_has($_SESSION, $key);
            self::close();

            return $result;
        }


        //多个键名SESSION检查
        self::start();
        foreach ($key as $item) {
            if (!$all) {
                $result = array_has($_SESSION, $item);
                if ($result) {
                    break;  //监测有一个键名存在就行了
                }
            } else {
                $result = $result && array_has($_SESSION, $item);
                if (!$result) {
                    break;  //监测到有一个键不存在，直接判定结果
                }
            }
        }
        self::close();
        return $result;
    }

    /**
     * 存入一个/一组数据到Session
     * @param string|array $key 该参数可以为KEY或者为数组
     * @param mixed $value 存入的数据，$key为数组则忽略此字段
     */
    public static function put($key, $value = null)
    {
        //如果单纯的只是存入一个键值对
        if (!is_array($key)) {
            $key = [$key => $value];
        }

        self::start();
        //存入一组数据到session
        foreach ($key as $arrayKey => $arrayValue) {
            $_SESSION[$arrayKey] = $arrayValue;
        }
        self::close();
    }

    /**
     * 删除一个/一组数据从Session
     * @param string|array $key 该参数可以为key或者数组
     */
    public static function forget($key)
    {
        self::start();
        if (!is_array($key)) {
            unset($_SESSION[$key]);
        } else {
            foreach ($key as $item) {
                unset($_SESSION[$item]);
            }
        }
        self::close();
    }

    /**
     * 销毁全部的Session变量，但不释放Session
     */
    public static function flush()
    {
        self::start();
        session_unset();
        self::close();
    }

    /**
     * 取出一个存放在Session当中的数据
     */
    public static function get($key, $default = "")
    {
        self::start();
        if (isset($_SESSION[$key])) {
            $result = $_SESSION[$key];
        } else {
            $result = $default;
        }
        self::close();
        return $result;
    }
}